#pragma once
#include <SDL.h>
namespace EPOC
{
#pragma region key bindings
	enum EPKey
	{
		EPKEY_UNKNOWN = SDL_SCANCODE_UNKNOWN,

    /**
     *  \name Usage page 0x07
     *
     *  These values are from usage page 0x07 (USB keyboard page).
     */
    /*@{*/

    EPKEY_A = SDL_SCANCODE_A,
    EPKEY_B = SDL_SCANCODE_B,
    EPKEY_C = SDL_SCANCODE_C,
    EPKEY_D = SDL_SCANCODE_D,
    EPKEY_E = SDL_SCANCODE_E,
    EPKEY_F = SDL_SCANCODE_F,
    EPKEY_G = SDL_SCANCODE_G,
    EPKEY_H = SDL_SCANCODE_H,
    EPKEY_I = SDL_SCANCODE_I,
    EPKEY_J = SDL_SCANCODE_J,
    EPKEY_K = SDL_SCANCODE_K,
    EPKEY_L = SDL_SCANCODE_L,
    EPKEY_M = SDL_SCANCODE_M,
    EPKEY_N = SDL_SCANCODE_N,
    EPKEY_O = SDL_SCANCODE_O,
    EPKEY_P = SDL_SCANCODE_P,
    EPKEY_Q = SDL_SCANCODE_Q,
    EPKEY_R = SDL_SCANCODE_R,
    EPKEY_S = SDL_SCANCODE_S,
    EPKEY_T = SDL_SCANCODE_T,
    EPKEY_U = SDL_SCANCODE_U,
    EPKEY_V = SDL_SCANCODE_V,
    EPKEY_W = SDL_SCANCODE_W,
    EPKEY_X = SDL_SCANCODE_X,
    EPKEY_Y = SDL_SCANCODE_Y,
    EPKEY_Z = SDL_SCANCODE_Z,

    EPKEY_1 = SDL_SCANCODE_1,
    EPKEY_2 = SDL_SCANCODE_2,
    EPKEY_3 = SDL_SCANCODE_3,
    EPKEY_4 = SDL_SCANCODE_4,
    EPKEY_5 = SDL_SCANCODE_5,
    EPKEY_6 = SDL_SCANCODE_6,
    EPKEY_7 = SDL_SCANCODE_7,
    EPKEY_8 = SDL_SCANCODE_8,
    EPKEY_9 = SDL_SCANCODE_9,
    EPKEY_0 = SDL_SCANCODE_0,

    EPKEY_RETURN = SDL_SCANCODE_RETURN,
    EPKEY_ESCAPE = SDL_SCANCODE_ESCAPE,
    EPKEY_BACKSPACE = SDL_SCANCODE_BACKSPACE,
    EPKEY_TAB = SDL_SCANCODE_TAB,
    EPKEY_SPACE = SDL_SCANCODE_SPACE,

     EPKEY_MINUS		  = SDL_SCANCODE_MINUS,
     EPKEY_EQUALS		  = SDL_SCANCODE_EQUALS,
     EPKEY_LEFTBRACKET  = SDL_SCANCODE_LEFTBRACKET,
     EPKEY_RIGHTBRACKET =  SDL_SCANCODE_RIGHTBRACKET,
     EPKEY_BACKSLASH	  = SDL_SCANCODE_BACKSLASH, /**< Located at the lower left of the return
													  *   key on ISO keyboards and at the right end
													  *   of the QWERTY row on ANSI keyboards.
													  *   Produces REVERSE SOLIDUS (backslash) and
													  *   VERTICAL LINE in a US layout, REVERSE
													  *   SOLIDUS and VERTICAL LINE in a UK Mac
													  *   layout, NUMBER SIGN and TILDE in a UK
													  *   Windows layout, DOLLAR SIGN and POUND SIGN
													  *   in a Swiss German layout, NUMBER SIGN and
													  *   APOSTROPHE in a German layout, GRAVE
													  *   ACCENT and POUND SIGN in a French Mac
													  *   layout, and ASTERISK and MICRO SIGN in a
													  *   French Windows layout.
													  */
     EPKEY_NONUSHASH = SDL_SCANCODE_NONUSHASH, /**< ISO USB keyboards actually use this code
											  *   instead of 49 for the same key, but all
											  *   OSes I've seen treat the two codes
											  *   identically. So, as an implementor, unless
											  *   your keyboard generates both of those
											  *   codes and your OS treats them differently,
											  *   you should generate SDL_SCANCODE_BACKSLASH
											  *   instead of this code. As a user, you
											  *   should not rely on this code because SDL
											  *   will never generate it with most (all?)
											  *   keyboards.
											  */
    EPKEY_SEMICOLON = SDL_SCANCODE_SEMICOLON,
    EPKEY_APOSTROPHE = SDL_SCANCODE_APOSTROPHE,
    EPKEY_GRAVE = SDL_SCANCODE_GRAVE, /**< Located in the top left corner (on both ANSI
									  *   and ISO keyboards). Produces GRAVE ACCENT and
									  *   TILDE in a US Windows layout and in US and UK
									  *   Mac layouts on ANSI keyboards, GRAVE ACCENT
									  *   and NOT SIGN in a UK Windows layout, SECTION
									  *   SIGN and PLUS-MINUS SIGN in US and UK Mac
									  *   layouts on ISO keyboards, SECTION SIGN and
									  *   DEGREE SIGN in a Swiss German layout (Mac:
									  *   only on ISO keyboards), CIRCUMFLEX ACCENT and
									  *   DEGREE SIGN in a German layout (Mac: only on
									  *   ISO keyboards), SUPERSCRIPT TWO and TILDE in a
									  *   French Windows layout, COMMERCIAL AT and
									  *   NUMBER SIGN in a French Mac layout on ISO
									  *   keyboards, and LESS-THAN SIGN and GREATER-THAN
									  *   SIGN in a Swiss German, German, or French Mac
									  *   layout on ANSI keyboards.
									  */
    EPKEY_COMMA  = SDL_SCANCODE_COMMA ,
    EPKEY_PERIOD = SDL_SCANCODE_PERIOD,
    EPKEY_SLASH  = SDL_SCANCODE_SLASH ,

    EPKEY_CAPSLOCK = SDL_SCANCODE_CAPSLOCK,

    EPKEY_F1 = SDL_SCANCODE_F1 ,
    EPKEY_F2 = SDL_SCANCODE_F2 ,
    EPKEY_F3 = SDL_SCANCODE_F3 ,
    EPKEY_F4 = SDL_SCANCODE_F4 ,
    EPKEY_F5 = SDL_SCANCODE_F5 ,
    EPKEY_F6 = SDL_SCANCODE_F6 ,
    EPKEY_F7 = SDL_SCANCODE_F7 ,
    EPKEY_F8 = SDL_SCANCODE_F8 ,
    EPKEY_F9 = SDL_SCANCODE_F9 ,
    EPKEY_F10 = SDL_SCANCODE_F10,
    EPKEY_F11 = SDL_SCANCODE_F11,
    EPKEY_F12 = SDL_SCANCODE_F12,

    EPKEY_PRINTSCREEN = SDL_SCANCODE_PRINTSCREEN,
    EPKEY_SCROLLLOCK = SDL_SCANCODE_SCROLLLOCK,
    EPKEY_PAUSE = SDL_SCANCODE_PAUSE,
    EPKEY_INSERT = SDL_SCANCODE_INSERT, /**< insert on PC, help on some Mac keyboards (but does send code 73, not 117) */
    EPKEY_HOME = SDL_SCANCODE_HOME,
    EPKEY_PAGEUP = SDL_SCANCODE_PAGEUP,
    EPKEY_DELETE = SDL_SCANCODE_DELETE,
    EPKEY_END = SDL_SCANCODE_END,
    EPKEY_PAGEDOWN = SDL_SCANCODE_PAGEDOWN,
    EPKEY_RIGHT = SDL_SCANCODE_RIGHT,
    EPKEY_LEFT = SDL_SCANCODE_LEFT,
    EPKEY_DOWN = SDL_SCANCODE_DOWN,
    EPKEY_UP = SDL_SCANCODE_UP,

    EPKEY_NUMLOCKCLEAR = SDL_SCANCODE_NUMLOCKCLEAR, /**< num lock on PC, clear on Mac keyboards
                                     */
    EPKEY_KP_DIVIDE = SDL_SCANCODE_KP_DIVIDE,
    EPKEY_KP_MULTIPLY = SDL_SCANCODE_KP_MULTIPLY,
    EPKEY_KP_MINUS = SDL_SCANCODE_KP_MINUS,
    EPKEY_KP_PLUS = SDL_SCANCODE_KP_PLUS,
    EPKEY_KP_ENTER = SDL_SCANCODE_KP_ENTER,
    EPKEY_KP_1 = SDL_SCANCODE_KP_1,
    EPKEY_KP_2 = SDL_SCANCODE_KP_2,
    EPKEY_KP_3 = SDL_SCANCODE_KP_3,
    EPKEY_KP_4 = SDL_SCANCODE_KP_4,
    EPKEY_KP_5 = SDL_SCANCODE_KP_5,
    EPKEY_KP_6 = SDL_SCANCODE_KP_6,
    EPKEY_KP_7 = SDL_SCANCODE_KP_7,
    EPKEY_KP_8 = SDL_SCANCODE_KP_8,
    EPKEY_KP_9 = SDL_SCANCODE_KP_9,
    EPKEY_KP_0 = SDL_SCANCODE_KP_0,
    EPKEY_KP_PERIOD = SDL_SCANCODE_KP_PERIOD,

    EPKEY_NONUSBACKSLASH = SDL_SCANCODE_NONUSBACKSLASH, /**< This is the additional key that ISO
														*   keyboards have over ANSI ones,
														*   located between left shift and Y.
														*   Produces GRAVE ACCENT and TILDE in a
														*   US or UK Mac layout, REVERSE SOLIDUS
														*   (backslash) and VERTICAL LINE in a
														*   US or UK Windows layout, and
														*   LESS-THAN SIGN and GREATER-THAN SIGN
														*   in a Swiss German, German, or French
														*   layout. */
    EPKEY_APPLICATION = SDL_SCANCODE_APPLICATION, /**< windows contextual menu, compose */
    EPKEY_POWER = SDL_SCANCODE_POWER,							/**< The USB document says this is a status flag,
																 *   not a physical key - but some Mac keyboards
																 *   do have a power key. */
    EPKEY_KP_EQUALS = SDL_SCANCODE_KP_EQUALS,
    EPKEY_F13 = SDL_SCANCODE_F13,
    EPKEY_F14 = SDL_SCANCODE_F14,
    EPKEY_F15 = SDL_SCANCODE_F15,
    EPKEY_F16 = SDL_SCANCODE_F16,
    EPKEY_F17 = SDL_SCANCODE_F17,
    EPKEY_F18 = SDL_SCANCODE_F18,
    EPKEY_F19 = SDL_SCANCODE_F19,
    EPKEY_F20 = SDL_SCANCODE_F20,
    EPKEY_F21 = SDL_SCANCODE_F21,
    EPKEY_F22 = SDL_SCANCODE_F22,
    EPKEY_F23 = SDL_SCANCODE_F23,
    EPKEY_F24 = SDL_SCANCODE_F24,
    EPKEY_EXECUTE = SDL_SCANCODE_EXECUTE,
    EPKEY_HELP = SDL_SCANCODE_HELP,
    EPKEY_MENU = SDL_SCANCODE_MENU,
    EPKEY_SELECT = SDL_SCANCODE_SELECT,
    EPKEY_STOP = SDL_SCANCODE_STOP,
    EPKEY_AGAIN = SDL_SCANCODE_AGAIN,   /**< redo */
    EPKEY_UNDO = SDL_SCANCODE_UNDO,
    EPKEY_CUT = SDL_SCANCODE_CUT,
    EPKEY_COPY = SDL_SCANCODE_COPY,
    EPKEY_PASTE = SDL_SCANCODE_PASTE,
    EPKEY_FIND = SDL_SCANCODE_FIND,
    EPKEY_MUTE = SDL_SCANCODE_MUTE,
    EPKEY_VOLUMEUP = SDL_SCANCODE_VOLUMEUP,
    EPKEY_VOLUMEDOWN = SDL_SCANCODE_VOLUMEDOWN,
/* not sure whether there's a reason to enable these */
/*     SDL_SCANCODE_LOCKINGCAPSLOCK = 130,  */
/*     SDL_SCANCODE_LOCKINGNUMLOCK = 131, */
/*     SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */
    EPKEY_KP_COMMA = SDL_SCANCODE_KP_COMMA,
    EPKEY_KP_EQUALSAS400 = SDL_SCANCODE_KP_EQUALSAS400,

    EPKEY_INTERNATIONAL1 = SDL_SCANCODE_INTERNATIONAL1, /**< used on Asian keyboards, see                                            footnotes in USB doc */
	EPKEY_INTERNATIONAL2 = SDL_SCANCODE_INTERNATIONAL2,
	EPKEY_INTERNATIONAL3 = SDL_SCANCODE_INTERNATIONAL3, /**< Yen */
	EPKEY_INTERNATIONAL4 = SDL_SCANCODE_INTERNATIONAL4,
	EPKEY_INTERNATIONAL5 = SDL_SCANCODE_INTERNATIONAL5,
	EPKEY_INTERNATIONAL6 = SDL_SCANCODE_INTERNATIONAL6,
	EPKEY_INTERNATIONAL7 = SDL_SCANCODE_INTERNATIONAL7,
	EPKEY_INTERNATIONAL8 = SDL_SCANCODE_INTERNATIONAL8,
	EPKEY_INTERNATIONAL9 = SDL_SCANCODE_INTERNATIONAL9,
	EPKEY_LANG1 = SDL_SCANCODE_LANG1, /**< Hangul/English toggle */
	EPKEY_LANG2 = SDL_SCANCODE_LANG2, /**< Hanja conversion */
	EPKEY_LANG3 = SDL_SCANCODE_LANG3, /**< Katakana */
	EPKEY_LANG4 = SDL_SCANCODE_LANG4, /**< Hiragana */
	EPKEY_LANG5 = SDL_SCANCODE_LANG5, /**< Zenkaku/Hankaku */
	EPKEY_LANG6 = SDL_SCANCODE_LANG6, /**< reserved */
	EPKEY_LANG7 = SDL_SCANCODE_LANG7, /**< reserved */
	EPKEY_LANG8 = SDL_SCANCODE_LANG8, /**< reserved */
	EPKEY_LANG9 = SDL_SCANCODE_LANG9, /**< reserved */

    EPKEY_ALTERASE = SDL_SCANCODE_ALTERASE, /**< Erase-Eaze */
    EPKEY_SYSREQ = SDL_SCANCODE_SYSREQ,
    EPKEY_CANCEL = SDL_SCANCODE_CANCEL,
    EPKEY_CLEAR = SDL_SCANCODE_CLEAR,
    EPKEY_PRIOR = SDL_SCANCODE_PRIOR,
    EPKEY_RETURN2 = SDL_SCANCODE_RETURN2,
    EPKEY_SEPARATOR = SDL_SCANCODE_SEPARATOR,
    EPKEY_OUT = SDL_SCANCODE_OUT,
    EPKEY_OPER = SDL_SCANCODE_OPER,
    EPKEY_CLEARAGAIN = SDL_SCANCODE_CLEARAGAIN,
    EPKEY_CRSEL = SDL_SCANCODE_CRSEL,
    EPKEY_EXSEL = SDL_SCANCODE_EXSEL,

    EPKEY_KP_00 = SDL_SCANCODE_KP_00,
    EPKEY_KP_000 = SDL_SCANCODE_KP_000,
    EPKEY_THOUSANDSEPARATOR = SDL_SCANCODE_THOUSANDSSEPARATOR,
    EPKEY_DECIMALSEPARATOR = SDL_SCANCODE_DECIMALSEPARATOR,
    EPKEY_CURRENCYUNIT = SDL_SCANCODE_CURRENCYUNIT,
    EPKEY_CURRENCYSUBUNIT = SDL_SCANCODE_CURRENCYSUBUNIT,
    EPKEY_KP_LEFTPAREN = SDL_SCANCODE_KP_LEFTPAREN,
    EPKEY_KP_RIGHTPAREN = SDL_SCANCODE_KP_RIGHTPAREN,
    EPKEY_KP_LEFTBRACE = SDL_SCANCODE_KP_LEFTBRACE,
    EPKEY_KP_RIGHTBRACE = SDL_SCANCODE_KP_RIGHTBRACE,
    EPKEY_KP_TAB = SDL_SCANCODE_KP_TAB,
    EPKEY_KP_BACKSPACE = SDL_SCANCODE_KP_BACKSPACE,
    EPKEY_KP_A = SDL_SCANCODE_KP_A,
    EPKEY_KP_B = SDL_SCANCODE_KP_B,
    EPKEY_KP_C = SDL_SCANCODE_KP_C,
    EPKEY_KP_D = SDL_SCANCODE_KP_D,
    EPKEY_KP_E = SDL_SCANCODE_KP_E,
    EPKEY_KP_F = SDL_SCANCODE_KP_F,
    EPKEY_KP_XOR = SDL_SCANCODE_KP_XOR,
    EPKEY_KP_POWER = SDL_SCANCODE_KP_POWER,
    EPKEY_KP_PERCENT = SDL_SCANCODE_KP_PERCENT,
    EPKEY_KP_LESS = SDL_SCANCODE_KP_LESS,
    EPKEY_KP_GREATER = SDL_SCANCODE_KP_GREATER,
    EPKEY_KP_AMPERSAND = SDL_SCANCODE_KP_AMPERSAND,
    EPKEY_KP_DBLAMPERSAND = SDL_SCANCODE_KP_DBLAMPERSAND,
    EPKEY_KP_VERTICALBAR = SDL_SCANCODE_KP_VERTICALBAR,
    EPKEY_KP_DBLVERTICALBAR = SDL_SCANCODE_KP_DBLVERTICALBAR,
    EPKEY_KP_COLON = SDL_SCANCODE_KP_COLON,
    EPKEY_KP_HASH = SDL_SCANCODE_KP_HASH,
    EPKEY_KP_SPACE = SDL_SCANCODE_KP_SPACE,
    EPKEY_KP_AT = SDL_SCANCODE_KP_AT,
    EPKEY_KP_EXCLAM = SDL_SCANCODE_KP_EXCLAM,
    EPKEY_KP_MEMSTORE = SDL_SCANCODE_KP_MEMSTORE,
    EPKEY_KP_MEMRECALL = SDL_SCANCODE_KP_MEMRECALL,
    EPKEY_KP_MEMCLEAR = SDL_SCANCODE_KP_MEMCLEAR,
    EPKEY_KP_MEMADD = SDL_SCANCODE_KP_MEMADD,
    EPKEY_KP_MEMSUBTRACT = SDL_SCANCODE_KP_MEMSUBTRACT,
    EPKEY_KP_MEMMULTIPLY = SDL_SCANCODE_KP_MEMMULTIPLY,
    EPKEY_KP_MEMDIVIDE = SDL_SCANCODE_KP_MEMDIVIDE,
    EPKEY_KP_PLUSMINUS = SDL_SCANCODE_KP_PLUSMINUS,
    EPKEY_KP_CLEAR = SDL_SCANCODE_KP_CLEAR,
    EPKEY_KP_CLEARENTRY = SDL_SCANCODE_KP_CLEARENTRY,
    EPKEY_KP_BINARY = SDL_SCANCODE_KP_BINARY,
    EPKEY_KP_OCTAL =  SDL_SCANCODE_KP_OCTAL,
    EPKEY_KP_DECIMAL = SDL_SCANCODE_KP_DECIMAL,
    EPKEY_KP_HEXADECIMAL = SDL_SCANCODE_KP_HEXADECIMAL,

    EPKEY_LCTRL = SDL_SCANCODE_LCTRL,
    EPKEY_LSHIFT = SDL_SCANCODE_LSHIFT,
    EPKEY_LALT = SDL_SCANCODE_LALT, /**< alt, option */
    EPKEY_LGUI = SDL_SCANCODE_LGUI, /**< windows, command (apple), meta */
    EPKEY_RCTRL = SDL_SCANCODE_RCTRL,
    EPKEY_RSHIFT = SDL_SCANCODE_RSHIFT,
    EPKEY_RALT = SDL_SCANCODE_RALT, /**< alt gr, option */
    EPKEY_RGUI = SDL_SCANCODE_RGUI, /**< windows, command (apple), meta */

    EPKEY_MODE = SDL_SCANCODE_MODE,    /**< I'm not sure if this is really not covered
										 *   by any of the above, but since there's a
										 *   special KMOD_MODE for it I'm adding it here
										 */

    ///*@}*//*Usage page 0x07*/

    ///**
    // *  \name Usage page 0x0C
    // *
    // *  These values are mapped from usage page 0x0C (USB consumer page).
    // */
    ///*@{*/

    //SDL_SCANCODE_AUDIONEXT = 258,
    //SDL_SCANCODE_AUDIOPREV = 259,
    //SDL_SCANCODE_AUDIOSTOP = 260,
    //SDL_SCANCODE_AUDIOPLAY = 261,
    //SDL_SCANCODE_AUDIOMUTE = 262,
    //SDL_SCANCODE_MEDIASELECT = 263,
    //SDL_SCANCODE_WWW = 264,
    //SDL_SCANCODE_MAIL = 265,
    //SDL_SCANCODE_CALCULATOR = 266,
    //SDL_SCANCODE_COMPUTER = 267,
    //SDL_SCANCODE_AC_SEARCH = 268,
    //SDL_SCANCODE_AC_HOME = 269,
    //SDL_SCANCODE_AC_BACK = 270,
    //SDL_SCANCODE_AC_FORWARD = 271,
    //SDL_SCANCODE_AC_STOP = 272,
    //SDL_SCANCODE_AC_REFRESH = 273,
    //SDL_SCANCODE_AC_BOOKMARKS = 274,

    ///*@}*//*Usage page 0x0C*/

    ///**
    // *  \name Walther keys
    // *
    // *  These are values that Christian Walther added (for mac keyboard?).
    // */
    ///*@{*/

    //SDL_SCANCODE_BRIGHTNESSDOWN = 275,
    //SDL_SCANCODE_BRIGHTNESSUP = 276,
    //SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display
    //                                       switch, video mode switch */
    //SDL_SCANCODE_KBDILLUMTOGGLE = 278,
    //SDL_SCANCODE_KBDILLUMDOWN = 279,
    //SDL_SCANCODE_KBDILLUMUP = 280,
    //SDL_SCANCODE_EJECT = 281,
    //SDL_SCANCODE_SLEEP = 282,

    //SDL_SCANCODE_APP1 = 283,
    //SDL_SCANCODE_APP2 = 284,

    ///*@}*//*Walther keys*/

    ///* Add any other keys here. */

    SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes */

	};

#pragma endregion

	class InputManager
	{
	public:
		InputManager(void);
		~InputManager(void);

		void Update(SDL_Event* sdlInputEvent);

		bool IsKeyDown(EPKey key);
		bool IsKeyPressed(EPKey key);

	private:
		SDL_Event m_event;
		bool m_keyState[SDL_NUM_SCANCODES];
		bool m_prevKeyState[SDL_NUM_SCANCODES];
	};


	
};
extern EPOC::InputManager* g_inputManager;
